package com.cqc.jdk8.Jutil;

import org.junit.Test;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class ConcurrentModificationExceptionTest {
    /**
     * 在单线程中，如果对集合同时 新增/删除 并遍历，那么就会抛出并发修改异常
     */

    /**
     * 还原 并发修改异常，方法1
     * 此方法用main方法中测试，就可以还原并发修改异常。用@Test就不行。
     */
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("1");
        list.add("2");

        Thread thread = new Thread() {
            @Override
            public void run() {
                list.add("120");
                list.add("121");
            }
        };
        thread.start();

        //遍历
        Iterator<String> iterator = list.iterator();
        while (iterator.hasNext()) {
            //触发异常 java.util.ConcurrentModificationException
            System.out.println(iterator.next());
        }
    }

    /**
     * 还原 并发修改异常，方法2
     */
    @Test
    public void concurrentModificationException() {
        //ArrayList 并发修改异常，使用 CopyOnWriteArrayList 避免并发修改异常
        List<String> list = new ArrayList<>();
        list.add("1");
        list.add("2");
        //有10个线程操作集合，都往里面塞数据
        ExecutorService executorService = Executors.newFixedThreadPool(10);
        for (int i = 0; i < 10; i++) {
            executorService.execute(() -> {
                for (int j = 0; j < 10; j++) {
                    list.add("120");
                }
            });
        }


        //遍历
        Iterator<String> iterator = list.iterator();
        while (iterator.hasNext()) {
            //触发异常 java.util.ConcurrentModificationException
            System.out.println(iterator.next());
        }
        executorService.shutdown();
    }

    /**
     * 使用CopyOnWriteArrayList避免并发修改异常
     */
//    public static void main(String[] args) {
//        List<String> list = new CopyOnWriteArrayList<>();
//        list.add("1");
//        list.add("2");
//
//        Thread thread = new Thread() {
//            @Override
//            public void run() {
//                list.add("120");
//                list.add("121");
//            }
//        };
//        thread.start();
//
//        //遍历
//        Iterator<String> iterator = list.iterator();
//        while (iterator.hasNext()) {
//            //不会触发异常 java.util.ConcurrentModificationException
//            System.out.println(iterator.next());
//        }
//    }


}
